<?php
namespace app\controller;

use app\BaseController;
use app\model\Device as DeviceModel;
use app\model\DeviceData;
use app\model\DeviceGroup;
use think\facade\Validate;
use think\facade\Db;

class Device extends BaseController
{
    /**
     * 获取设备列表
     */
    public function index()
    {
        // 获取请求参数
        $params = $this->request->get();

    //  // 原生查询验证
    //  $id = ['id'=>1];
    //  $rawData = Db::table('iot_device')->find($id);
    //  var_dump('Raw Data:', $rawData);
     
    //  // 模型查询
    //  $device = DeviceModel::with(['group'])->find($id);
    //  var_dump('Model Data:', $device ? $device->toArray() : null);
     
    //  // 检查软删除条件
    //  $sql = DeviceModel::fetchSql(true)->find($id);
    //  var_dump('Generated SQL:', $sql);
     
    //  exit;

          // 获取原始数据库数据
   // 获取原始数据库数据
//    $rawData = Db::table('iot_device')->select();
//    var_dump($rawData);
   
//    // 获取模型数据
//    $modelData = $query->select();
//    var_dump($modelData->toArray());
   
//    exit;
        // 修复查询构建顺序（关键修改）
        $query = DeviceModel::withSearch(['name', 'status', 'group_id', 'protocol'], $params)
            ->with(['group'])
            ->order('name');

        // 分页需要先转换为实际的查询对象
        $list = $query->paginate([
            'list_rows' => $params['pageSize'] ?? 10,
            'page' => $params['page'] ?? 1,
        ]);

        return $this->success('获取成功', $list);
    }
    
    /**
     * 添加设备
     */
    public function add()
    {
        // 获取请求数据
        $data = $this->request->post();
        
        // 验证数据
        $validate = Validate::rule([
            'name' => 'require',
            'serial_no' => 'require|unique:device',
            'protocol' => 'require',
            'group_id' => 'number',
            'status' => 'number|in:0,1,2',
        ]);
        
        if (!$validate->check($data)) {
            return $this->error('参数错误：' . $validate->getError());
        }
        
        // 验证设备组是否存在
        if (!empty($data['group_id'])) {
            $group = DeviceGroup::find($data['group_id']);
            if (!$group) {
                return $this->error('设备组不存在');
            }
        }
        
        try {
            // 创建设备
            $device = new DeviceModel($data);
            $device->save();
            
            return $this->success('添加成功', $device);
        } catch (\Exception $e) {
            return $this->error('添加失败：' . $e->getMessage());
        }
    }
    
    /**
     * 编辑设备
     */
    public function edit()
    {
        // 获取请求数据
        $data = $this->request->put();
        
        // 验证参数
        $validate = Validate::rule([
            'id' => 'require|number',
            'name' => 'require',
            'protocol' => 'require',
            'group_id' => 'number',
            'status' => 'number|in:0,1,2',
        ]);
        
        if (!$validate->check($data)) {
            return $this->error('参数错误：' . $validate->getError());
        }
        
        // 查询设备
        $device = DeviceModel::find($data['id']);
        if (!$device) {
            return $this->error('设备不存在');
        }
        
        // 验证设备组是否存在
        if (!empty($data['group_id'])) {
            $group = DeviceGroup::find($data['group_id']);
            if (!$group) {
                return $this->error('设备组不存在');
            }
        }
        
        try {
            // 更新设备
            $device->save($data);
            
            return $this->success('更新成功', $device);
        } catch (\Exception $e) {
            return $this->error('更新失败：' . $e->getMessage());
        }
    }
    
    /**
     * 删除设备
     * @param int $id 设备ID
     */
    public function delete($id)
    {
        // 查询设备
        $device = DeviceModel::find($id);
        if (!$device) {
            return $this->error('设备不存在');
        }
        
        try {
            // 软删除设备
            $device->delete();
            
            return $this->success('删除成功');
        } catch (\Exception $e) {
            return $this->error('删除失败：' . $e->getMessage());
        }
    }
    
    /**
     * 获取设备详情
     * @param int $id 设备ID
     */
    public function detail($id)
    {
        // 查询设备
        $device = DeviceModel::with(['group'])->find($id);
        if (!$device) {
            return $this->error('设备不存在');
        }
        
        return $this->success('获取成功', $device);
    }
    
    /**
     * 获取设备数据
     * @param int $id 设备ID
     */
    public function getData($id)
    {
        // 获取请求参数
        $params = $this->request->get();
        
        // 查询设备
        $device = DeviceModel::find($id);
        if (!$device) {
            return $this->error('设备不存在');
        }
        
        // 构建查询
        $query = DeviceData::where('device_id', $id);
        
        // 按时间范围筛选
        if (!empty($params['start_time']) && !empty($params['end_time'])) {
            $query = $query->whereBetweenTime('data_time', $params['start_time'], $params['end_time']);
        }
        
        // 按数据类型筛选
        if (!empty($params['data_type'])) {
            $query = $query->where('data_type', $params['data_type']);
        }
        
        // 按告警状态筛选
        if (isset($params['is_alarm']) && $params['is_alarm'] !== '') {
            $query = $query->where('is_alarm', $params['is_alarm']);
        }
        
        // 按时间倒序
        $query = $query->order('data_time', 'desc');
        
        // 分页
        $list = $query->paginate([
            'list_rows' => $params['pageSize'] ?? 10,
            'page' => $params['page'] ?? 1,
        ]);
        
        return $this->success('获取成功', $list);
    }
    
    /**
     * 获取设备统计数据
     */
    public function statistics()
    {
        // 设备总数
        $totalCount = DeviceModel::count();
        
        // 在线设备数
        $onlineCount = DeviceModel::where('status', 1)->count();
        
        // 离线设备数
        $offlineCount = DeviceModel::where('status', 0)->count();
        
        // 故障设备数
        $faultCount = DeviceModel::where('status', 2)->count();
        
        // 最近24小时数据量
        $dataCount = DeviceData::whereTime('data_time', '-24 hours')->count();
        
        // 最近24小时告警数
        $alarmCount = DeviceData::whereTime('data_time', '-24 hours')
            ->where('is_alarm', 1)
            ->count();
        
        return $this->success('获取成功', [
            'total_count' => $totalCount,
            'online_count' => $onlineCount,
            'offline_count' => $offlineCount,
            'fault_count' => $faultCount,
            'data_count' => $dataCount,
            'alarm_count' => $alarmCount
        ]);
    }
    

}

